#! /bin/sh
#
# ADD.MODULES, Adds $ETC/*.modules to the $HOME/.login, .cshrc, .profile,
#              .bashrc & .kshenv
# Copyright (C) 2000-2017 R.K. Owen
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

##########################################################################

VERSION='$Id: 196cf1d4fbd7d3deecf648e85ee37ead75a60a93 $'
SKEL=/etc/skel
ETC=/skel
/bin/cat <<!

$0
	adds a few lines to the beginning of your
	$HOME/.cshrc, $HOME/.login,
	$HOME/.profile, $HOME/.bashrc, and
	possibly your $HOME/.kshenv (or whatever is
	specified by the ENV environment variable).
!
if [ -r $HOME/.bash_profile ]; then
	/bin/cat <<!
	Also your $HOME/.bash_profile will be processed.
!
fi
if [ -r $HOME/.bash_login ]; then
	/bin/cat <<!
	Also your $HOME/.bash_login will be processed.
!
fi
/bin/cat <<!
	The lines are prepended for sourcing the $ETC/csh.modules or
	$ETC/profile.modules files or to define the module alias or function.
	Why is it necessary?
	To ensure that you will have access to modules for all subshells,
	these lines need to be added to some of your 'dot' files.

	Your old .cshrc, .login, .profile, .bashrc and .kshenv will be
	renamed to .login.old, .cshrc.old, .profile.old, .bashrc.old and
	.kshenv.old respectively.  So if you have any problems you will
	can easily restore them.

	This is version $VERSION .

!

/bin/echo "Continue on (type n for no - default=yes)?\c"
read xxx

if [ x$xxx = xn ]
then
	exit 1
fi

# cleanse old dot file $1=file $2=clean temporary $3=file.old
cleandot() {
	/bin/cat <<!
Cleaning $1
!
	mv $1 $3
	sed \
-e "/^[ 	]*if[ 	]*([ 	]*-e[ 	].*\/csh\.modules[ 	]*)[ 	]*then[ 	]*\$/,/^[	]*endif[ 	]*\$/d" \
-e "/^[ 	]*if[ 	]*\[[ 	]*-[ef][ 	].*\/profile\.modules[ 	]*][ 	]*\$/,/^[ 	]*fi[ 	]*\$/d" \
-e "/^[ 	]*if[ 	]*\[[ 	]*-[ef][ 	].*\/profile\.modules[ 	]*].*then[ 	]*\$/,/^[ 	]*fi[ 	]*\$/d" \
-e "/^[ 	]*if[ 	]*([ 	]*\$?tcsh[ 	]*)[ 	]*then[ 	]*\$/,/^[ 	]*alias[ 	]*module[ 	]*.*\$/d" \
-e "/^[ 	]*module().*[ 	]*.*}[ 	]*\$/d" \
-e "/^[ 	]*case[ 	]*\"\$0\"[ 	]*in[ 	]*\$/,/^[ 	]*esac[ 	]*\$/d" \
-e "/^[ 	]*source[ 	]*.*\/Modules.*\$/d" \
-e "/^[ 	]*source[ 	]*.*\/csh\.modules[ 	]*/d" \
-e "/^[ 	]*\.[ 	]*.*\/profile\.modules[ 	]*/d" \
	$3 > $2
}

# find if certain of the dot files have load lines already
findload() {
	grep "^[ 	]*module[ 	]*load" $1 > /tmp/load.$$
}

# put common stuff derivatives here $1=.dot_file $2=action $3=shell(csh,sh) $4=skel alternative
shdot() {
	if [ -f $1 ]
	then
		/bin/cat <<!

Processing your $1 (your old one is $1.old)
!
		if cleandot $1 /tmp/$1.$$ $1.old
		then
			if [ x$2 = xsource ]
			then
				/bin/cat <<!
Adding sourcing lines at beginning of $1
!
				if [ x$3 = xsh ]
				then
					findload $1.old
					/bin/cat > $1 <<!
if [ -f $ETC/profile.modules ]
then
	. $ETC/profile.modules
# put your own module loads here
!
				if [ -s /tmp/load.$$ ]
				then
					/bin/cat /tmp/load.$$ >> $1
				else
					/bin/cat >> $1 <<!
	module load null
!
				fi
					/bin/cat >> $1 <<!
fi
!
				elif [ x$3 = xcsh ]
				then
					findload $1.old
					/bin/cat > $1 <<!
if ( -e $ETC/csh.modules ) then
	source $ETC/csh.modules
# put your own module loads here
!
				if [ -s /tmp/load.$$ ]
				then
					/bin/cat /tmp/load.$$ >> $1
				else
					/bin/cat >> $1 <<!
	module load null
!
				fi
					/bin/cat >> $1 <<!
endif
!
				fi
				/bin/cat /tmp/$1.$$ >> $1 && /bin/rm /tmp/$1.$$
			elif [ x$2 = xalias ]
			then
				/bin/cat <<!
Adding alias or function lines at beginning of $1
!
				if [ x$3 = xsh ]
				then
					/bin/cat > $1 <<!
case "\$0" in
          -sh|sh|*/sh)	modules_shell=sh ;;
       -ksh|ksh|*/ksh)	modules_shell=ksh ;;
       -zsh|zsh|*/zsh)	modules_shell=zsh ;;
    -bash|bash|*/bash)	modules_shell=bash ;;
esac
module() { eval \`@TCLSH@ @libexecdir@/modulecmd.tcl \$modules_shell \$*\`; }
!
				elif [ x$3 = xcsh ]
				then
					/bin/cat > $1 <<!
if (\$?tcsh) then
        set modules_shell="tcsh"
else
        set modules_shell="csh"
endif
alias module 'eval \`@TCLSH@ @libexecdir@/modulecmd.tcl '\$modules_shell '\!*\`'
!
				fi
				/bin/cat /tmp/$1.$$ >> $1 && /bin/rm /tmp/$1.$$
			fi
		else
			/bin/echo "Had problems with your $1"
		fi
	else
		/bin/cat <<!
You had no $1 as I see it.  Copying $4 for you.
!
		/bin/cp $4 $1
	fi
	/bin/rm /tmp/load.$$ 2> /dev/null
}

# process files in $HOME
cd $HOME
if [ -r .bash_profile ]; then
	shdot .bash_profile source sh $SKEL/.profile
fi
if [ -r .bash_login ]; then
	shdot .bash_login source sh $SKEL/.profile
fi
shdot .profile source sh $SKEL/.profile
shdot .bashrc alias sh $SKEL/.kshenv
shdot `basename ${ENV:=.kshenv}` alias sh $SKEL/.kshenv
shdot .login source csh $SKEL/.login
shdot .cshrc alias csh $SKEL/.cshrc

exit
